package org.example.utils;

import com.alibaba.druid.util.StringUtils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;
import java.nio.charset.StandardCharsets;

/**
 * JWT工具类
 * 用于生成、解析和验证JWT Token
 */
@Data
@Component
@ConfigurationProperties(prefix = "jwt.token")
public class JwtHelper {


    // token过期时间,单位秒
    private long tokenExpiration;

    // token签名密钥
    private String tokenSignKey;


    // 根据用户ID生成 Token
    public String createToken(Long userId) {
        System.out.println("tokenExpiration = " + tokenExpiration);
        System.out.println("tokenSignKey = " + tokenSignKey);
        
        // 使用固定的密钥生成安全密钥，确保长度满足要求
        SecretKey secretKey = Keys.hmacShaKeyFor(tokenSignKey.getBytes(StandardCharsets.UTF_8));
        
        // 使用JJWT库构建JWT Token
        String token = Jwts.builder()

                .setSubject("YYGH-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration * 1000 * 60)) //单位分钟
                .claim("userId", userId)
                .signWith(secretKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }

    // 从token中获取用户ID
    public Long getUserId(String token) {
        if (StringUtils.isEmpty(token)) return null;
        
        // 使用固定的密钥生成安全密钥
        SecretKey secretKey = Keys.hmacShaKeyFor(tokenSignKey.getBytes(StandardCharsets.UTF_8));
        
        Jws<Claims> claimsJws = Jwts.parserBuilder()
                .setSigningKey(secretKey)
                .build()
                .parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer) claims.get("userId");
        return userId.longValue();
    }


    // 判断token是否过期
    public boolean isExpiration(String token) {
        try {
            // 使用固定的密钥生成安全密钥
            SecretKey secretKey = Keys.hmacShaKeyFor(tokenSignKey.getBytes(StandardCharsets.UTF_8));
            
            // 解析token并判断是否过期
            boolean isExpire = Jwts.parserBuilder()
                    .setSigningKey(secretKey)
                    .build()
                    .parseClaimsJws(token)
                    .getBody()
                    .getExpiration().before(new Date());
            //没有过期，有效，返回false
            return isExpire;
        } catch (Exception e) {
            //过期出现异常，返回true
            return true;
        }
    }
}